package cl.loso.melon.server.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import cl.loso.melon.server.util.Util;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.SortDirection;
import com.google.appengine.api.datastore.QueryResultList;
import com.google.appengine.api.datastore.Query.FilterOperator;

/**
 * The class fetches the orders page by page.
 * 
 * @author
 * 
 */
@SuppressWarnings("serial")
public class ReporteTemasExcelServlet extends HttpServlet {
	private static Log logger = LogFactory
			.getLog(ReporteTemasExcelServlet.class);

	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {

		String nombre = "temas_" + UUID.randomUUID().toString() + ".xls";
		resp.setHeader("Content-type", "application/vnd.ms-excel");
		resp.setHeader("Content-Disposition", "attachment; filename=\""
				+ nombre + "\"");

		PrintWriter writer = resp.getWriter();
		int colspan = 0;
		try {
			String fechaini = URLDecoder.decode(req.getParameter("fechaini"));
			String fechater = URLDecoder.decode(req.getParameter("fechater"));
			String idItem = req.getParameter("item");
			String idNegocio = req.getParameter("idNegocio");
			String idSitio = req.getParameter("idSitio");
			String idArea = req.getParameter("idArea");
			String idTipo = req.getParameter("idTipo");
			Date fecha_inicial = null;
			Date fecha_final = null;

			if (idTipo.equals("1")) {
				colspan = 8;
			} else if (idTipo.equals("2")) {
				colspan = 6;
			} else if (idTipo.equals("3")) {
				colspan = 6;
			}

			StringBuffer sb = new StringBuffer();

			DateFormat formato = new SimpleDateFormat("dd/MM/yyyy");

			fecha_inicial = (Date) formato.parse(fechaini);
			fecha_final = (Date) formato.parse(fechater);

			Iterable<Entity> temas = Util.listAllEntities("ItemLVS");
			for (Entity tema : temas) {
				Key key = tema.getKey();
				Entity entity = Util.getFromCache(key);
				if (entity == null) {
					Util.addToCache(key, tema);
				}

			}

			DatastoreService datastore = DatastoreServiceFactory
					.getDatastoreService();

			Query q = null;

			if (idTipo.equals("1")) {
				q = new Query("VisitaItemLVS");
				q.addFilter("fecha", FilterOperator.GREATER_THAN_OR_EQUAL,
						fecha_inicial);
				q.addFilter("fecha", FilterOperator.LESS_THAN_OR_EQUAL,
						fecha_final);

				if (!idItem.equals("0")) {
					q.addFilter("item", FilterOperator.EQUAL,
							Long.valueOf(idItem).longValue());
				}

				if (!idNegocio.equals("0") && idSitio.equals("0")
						&& idArea.equals("0")) {
					q.addFilter("negocio", FilterOperator.EQUAL,
							Long.valueOf(idNegocio).longValue());

				} else if (!idNegocio.equals("0") && !idSitio.equals("0")
						&& idArea.equals("0")) {
					q.addFilter("negocio", FilterOperator.EQUAL,
							Long.valueOf(idNegocio).longValue());
					q.addFilter("sitio", FilterOperator.EQUAL,
							Long.valueOf(idSitio).longValue());

				} else if (!idNegocio.equals("0") && !idSitio.equals("0")
						&& !idArea.equals("0")) {
					q.addFilter("negocio", FilterOperator.EQUAL,
							Long.valueOf(idNegocio).longValue());
					q.addFilter("sitio", FilterOperator.EQUAL,
							Long.valueOf(idSitio).longValue());
					q.addFilter("area", FilterOperator.EQUAL,
							Long.valueOf(idArea).longValue());
				}

			} else if (idTipo.equals("2")) {

				if (!idItem.equals("0")) {
					Key llaveItem = KeyFactory.createKey("ItemLVS",
							Long.valueOf(idItem));
					q = new Query("ItemLVS");
					q.addFilter(Entity.KEY_RESERVED_PROPERTY,
							FilterOperator.EQUAL, llaveItem);

				} else {

					Iterable<Entity> temasos = Util.listVisitaItem(
							"VisitaItemLVS", fecha_inicial, fecha_final);

					List<Key> listaVisitasItem = new ArrayList<Key>();
					for (Entity temita : temasos) {
						Long itemId = (Long) temita.getProperty("item");
						Key llaveItem = KeyFactory.createKey("ItemLVS", itemId);

						if (!listaVisitasItem.contains(llaveItem)) {
							listaVisitasItem.add(llaveItem);
						}
					}

					if (!listaVisitasItem.isEmpty()) {
						q = new Query("ItemLVS");
						q.addFilter(Entity.KEY_RESERVED_PROPERTY,
								FilterOperator.IN, listaVisitasItem);
						q.addSort("descripcion", SortDirection.ASCENDING);
					}
				}

			} else if (idTipo.equals("3")) {
				q = new Query("NegocioLVS");
				q.addSort("nombre", SortDirection.ASCENDING);
			}

			if (q == null)
				throw new Exception("no hay filas");

			FetchOptions fetchOptions = FetchOptions.Builder.withDefaults();

			PreparedQuery queryString = datastore.prepare(q);

			String pageContent = "<tbody>";

			QueryResultList<Entity> results = queryString
					.asQueryResultList(fetchOptions);

			StringBuilder header = null;

			if (idTipo.equals("1")) {
				header = new StringBuilder("<thead><tr>"
						+ "<th scope=\"col\">TCS</th>"
						+ "<th scope=\"col\">Fecha</th>"
						+ "<th scope=\"col\">Negocio</th>"
						+ "<th scope=\"col\">Sitio</th>"
						+ "<th scope=\"col\">Area</th>"
						+ "<th scope=\"col\">Evaluados</th>"
						+ "<th scope=\"col\">Seguros</th>"
						+ "<th scope=\"col\">Inseguros</th>" + "</tr></thead>");
			} else if (idTipo.equals("2")) {
				header = new StringBuilder("<thead><tr>"
						+ "<th scope=\"col\">TCS</th>"
						+ "<th scope=\"col\">Evaluados</th>"
						+ "<th scope=\"col\">Seguros</th>"
						+ "<th scope=\"col\">Inseguros</th>"
						+ "<th scope=\"col\">% Seg.</th>"
						+ "<th scope=\"col\">% Inseg.</th>" + "</tr></thead>");
			} else if (idTipo.equals("3")) {
				header = new StringBuilder("<thead><tr>"
						+ "<th scope=\"col\">Negocio</th>"
						+ "<th scope=\"col\">Evaluados</th>"
						+ "<th scope=\"col\">Seguros</th>"
						+ "<th scope=\"col\">Inseguros</th>"
						+ "<th scope=\"col\">% Seg.</th>"
						+ "<th scope=\"col\">% Inseg.</th>" + "</tr></thead>");
			}

			DecimalFormat formateador = new DecimalFormat("###.#%");

			if (idTipo.equals("1")) {
				for (Entity entity : results) {
					Long itemId = (Long) entity.getProperty("item");
					Key llaveItem = KeyFactory.createKey("ItemLVS", itemId);
					String nombreItem = (String) Util.getFromCache(llaveItem)
							.getProperty("descripcion");
					String nombreNegocio = (String) entity
							.getProperty("nombreNegocio");
					String nombreSitio = (String) entity
							.getProperty("nombreSitio");
					String nombreArea = (String) entity
							.getProperty("nombreArea");
					Date fecha = (Date) entity.getProperty("fecha");
					//Long tseguro = (Long) entity.getProperty("tseguro");
					//Long tinseguro = (Long) entity.getProperty("tinseguro");
					Boolean bseg=(Boolean)entity.getProperty("seguro");
					Boolean binseg=(Boolean)entity.getProperty("inseguro");
					int tseguro = bseg ? 1:0;
					int tinseguro = binseg ? 1:0;
					
					Long teval = (Long) entity.getProperty("teval");
					DateFormat formFecha = new SimpleDateFormat("dd/MM/yyyy");
					pageContent += "<tr><td align='left' nowrap>" + nombreItem
							+ "</td><td align='center'>"
							+ formFecha.format(fecha)
							+ "</td><td align='left' nowrap>" + nombreNegocio
							+ "</td><td align='left' nowrap>" + nombreSitio
							+ "</td>" + "<td align='left' nowrap>" + nombreArea
							+ "</td>" + "<td align='right'>" + teval + "</td>"
							+ "<td align='right'>" + tseguro
							+ "</td><td align='right'>" + tinseguro
							+ "</td></tr>";

				}
			} else if (idTipo.equals("2")) {
				for (Entity entity : results) {
					Key k = entity.getKey();
					Long itemId = (Long) k.getId();
					String nombreItem = (String) Util.getFromCache(k)
							.getProperty("descripcion");
					Long[] totales = Util.TotalSegurosEInseguros(fecha_inicial,
							fecha_final, itemId);
					long totalEvaluados = totales[0];

					long totalSeguros = totales[1];
					long totalInseguros = totales[2];

					double pseguros = 0;
					double pinseguros = 0;

					if (totalEvaluados != 0)
						pseguros = (double) totalSeguros
								/ (double) totalEvaluados;

					if (totalEvaluados != 0)
						pinseguros = (double) totalInseguros
								/ (double) totalEvaluados;

					pageContent += "<tr><td align='left' nowrap>" + nombreItem
							+ "</td><td align='right'>" + totalEvaluados
							+ "</td><td align='right'>" + totalSeguros
							+ "</td>" + "<td align='right'>" + totalInseguros
							+ "</td>" + "<td align='right'>"
							+ formateador.format(pseguros) + "</td>"
							+ "<td align='right'>"
							+ formateador.format(pinseguros) + "</td></tr>";

				}
			} else if (idTipo.equals("3")) {
				for (Entity entity : results) {
					Key k = entity.getKey();
					Long negocioId = (Long) k.getId();
					String nombreNegocio = (String) entity
							.getProperty("nombre");
					Long[] totales = Util.TotalSegurosEInsegurosPorNegocio(
							fecha_inicial, fecha_final, negocioId);
					long totalEvaluados = totales[0];
					long totalSeguros = totales[1];
					long totalInseguros = totales[2];

					double pseguros = 0;
					double pinseguros = 0;

					if (totalEvaluados != 0)
						pseguros = (double) totalSeguros
								/ (double) totalEvaluados;

					if (totalEvaluados != 0)
						pinseguros = (double) totalInseguros
								/ (double) totalEvaluados;

					pageContent += "<tr><td align='left' nowrap>"
							+ nombreNegocio + "</td><td align='right'>"
							+ totalEvaluados + "</td><td align='right'>"
							+ totalSeguros + "</td>" + "<td align='right'>"
							+ totalInseguros + "</td>" + "<td align='right'>"
							+ formateador.format(pseguros) + "</td>"
							+ "<td align='right'>"
							+ formateador.format(pinseguros) + "</td></tr>";
				}
			}

			if (results.isEmpty()) {
				pageContent += "<tbody><tr><td colspan=\"" + colspan
						+ "\">No hay registros</td></tr>";
			}

			pageContent += "</tbody>";
			sb.append("<table id=\"tblReporteTema\" width=\"100%\" cellspacing=\"1\" border=\"0\" class=\"tablesorter\">");
			sb.append(header);
			sb.append(pageContent);
			sb.append("</table>");
			writer.println(sb.toString());
		} catch (Exception e) {
			writer.println("<table id=\"tblReporteTema\" width=\"100%\" cellspacing=\"1\" border=\"0\" class=\"tablesorter\"><tbody><tr><td colspan=\""
					+ colspan + "\">No hay registros</td></tr></tbody></table>");
			logger.info("Problemas en  : " + this.getClass().getSimpleName()
					+ " Error : " + e.getMessage());
		} finally {
			writer.close();
		}
	}


}